home *** CD-ROM | disk | FTP | other *** search
/ Chip 2011 November / CHIP_2011_11.iso / Programy / Inne / Gry / Carnage_Contest / scripts / CC Original / weapons / Frag Grenade.lua < prev    next >
Text File  |  2010-08-31  |  9KB  |  246 lines

  1. --------------------------------------------------------------------------------
  2. -- Weapon Frag Grenade + Projectile Frag Grenade + Projectile Cluster
  3. -- Original Carnage Contest Weapon
  4. -- Script by DC, August 2009, www.UnrealSoftware.de
  5. --------------------------------------------------------------------------------
  6.  
  7. -- Setup Tables
  8. if cc==nil then cc={} end
  9. cc.fraggrenade={}
  10. cc.fraggrenade.fraggrenade={}
  11. cc.fraggrenade.cluster={}
  12.  
  13. -- Load & Prepare Ressources
  14. cc.fraggrenade.gfx_wpn=loadgfx("weapons/fraggrenade.bmp")                    -- Weapon Image
  15. setmidhandle(cc.fraggrenade.gfx_wpn)
  16. cc.fraggrenade.gfx_cluster=loadgfx("weapons/cluster.bmp")                    -- Cluster Image
  17. setmidhandle(cc.fraggrenade.gfx_cluster)
  18. cc.fraggrenade.sfx_attack=loadsfx("throw.ogg")                                -- Attack Sound
  19. cc.fraggrenade.sfx_bounce=loadsfx("bounce.wav")                                -- Bounce Sound
  20.  
  21. --------------------------------------------------------------------------------
  22. -- Weapon: Frag Grenade
  23. --------------------------------------------------------------------------------
  24.  
  25. cc.fraggrenade.id=addweapon("cc.fraggrenade","Frag Grenade",cc.fraggrenade.gfx_wpn,5)    -- Add Weapon (5 uses)
  26.  
  27. function cc.fraggrenade.draw()                                                    -- Draw
  28.     if weapon_shots<=0 then
  29.         setblend(blend_alpha)
  30.         setalpha(1)
  31.         setcolor(255,255,255)
  32.         drawinhand(cc.fraggrenade.gfx_wpn,6,0)
  33.     end
  34.     -- HUD chargebar
  35.     if weapon_charge>0 and weapon_shots==0 then
  36.         hudchargebar(weapon_charge,100)
  37.     end
  38.     -- HUD Crosshair / HUD Timer
  39.     if weapon_shots==0 then
  40.         hudcrosshair(4,3)
  41.         hudtimer(3,1,10)
  42.     end
  43. end
  44.  
  45. function cc.fraggrenade.attack(attack)                                            -- Attack
  46.     if (weapon_shots<=0) then
  47.         -- Charge
  48.         if (attack==1) then
  49.             weapon_charge=weapon_charge+1                                        -- Increase charge
  50.         end
  51.         -- Fire a projectile (on release/full charge)
  52.         if (attack==0 and weapon_charge>0) or (weapon_charge>=100) then
  53.             -- No more weapon switching!
  54.             useweapon(0)
  55.             playsound(cc.fraggrenade.sfx_attack)
  56.             weapon_shots=weapon_shots+1
  57.             id=createprojectile(cc.fraggrenade.fraggrenade.id)
  58.             projectiles[id]={}
  59.             -- Ignore collision with current player at beginning
  60.             projectiles[id].ignore=playercurrent()
  61.             -- Set initial position of projectile
  62.             projectiles[id].x=getplayerx(0)+(4*getplayerdirection(0))
  63.             projectiles[id].y=getplayery(0)+3
  64.             -- Initial collision check (avoid throwing into other objects)
  65.             for i=0,10,1 do
  66.                 if collision(col5x5,projectiles[id].x+math.sin(math.rad(getplayerrotation(0)))*i,projectiles[id].y-math.cos(math.rad(getplayerrotation(0)))*i)==1 then
  67.                     if terraincollision()==1 or objectcollision()>0 or playercollision()~=projectiles[id].ignore then
  68.                         if (i==0) then
  69.                             projectiles[id].x=getplayerx(0)
  70.                             projectiles[id].y=getplayery(0)+3
  71.                             break
  72.                         else
  73.                             projectiles[id].x=getplayerx(0)+(4*getplayerdirection(0))+math.sin(math.rad(getplayerrotation(0)))*(i-1)
  74.                             projectiles[id].y=getplayery(0)+3-math.cos(math.rad(getplayerrotation(0)))*(i-1)
  75.                             break
  76.                         end
  77.                     end
  78.                 end
  79.             end
  80.             -- Set speed of projectile
  81.             projectiles[id].sx=math.sin(math.rad(getplayerrotation(0)))*(weapon_charge/100.0)*10.0
  82.             projectiles[id].sy=-math.cos(math.rad(getplayerrotation(0)))*(weapon_charge/100.0)*10.0
  83.             -- Set timer
  84.             projectiles[id].timer=weapon_timer*50
  85.             -- Effects
  86.             recoil(2)
  87.             -- End Turn
  88.             endturn()
  89.         end
  90.     end
  91. end
  92.  
  93. --------------------------------------------------------------------------------
  94. -- Projectile: Frag Grenade
  95. --------------------------------------------------------------------------------
  96.  
  97. cc.fraggrenade.fraggrenade.id=addprojectile("cc.fraggrenade.fraggrenade")    -- Add Projectile
  98.  
  99. function cc.fraggrenade.fraggrenade.draw(id)                                -- Draw
  100.     -- Setup draw mode
  101.     setblend(blend_alpha)
  102.     setalpha(1)
  103.     setcolor(255,255,255)
  104.     setscale(1,1)
  105.     -- Calculate projectile rotation
  106.     setrotation(math.deg(math.atan2(projectiles[id].sx,-projectiles[id].sy)))
  107.     -- Draw projectile
  108.     drawimage(cc.fraggrenade.gfx_wpn,projectiles[id].x,projectiles[id].y)
  109.     -- Draw Arrow if out of Screen
  110.     outofscreenarrow(projectiles[id].x,projectiles[id].y)
  111. end
  112.  
  113. function cc.fraggrenade.fraggrenade.update(id)                                -- Update
  114.     -- Gravity influence on speed
  115.     projectiles[id].sy=projectiles[id].sy+getgravity()
  116.     -- Move (in substep loop for optimal collision precision)
  117.     msubt=math.ceil(math.max(math.abs(projectiles[id].sx),math.abs(projectiles[id].sy))/3)
  118.     msubx=projectiles[id].sx/msubt
  119.     msuby=projectiles[id].sy/msubt
  120.     for i=1,msubt,1 do
  121.         -- Move X
  122.         projectiles[id].x=projectiles[id].x+msubx
  123.         if collision(col5x5,projectiles[id].x,projectiles[id].y)==1 then
  124.             if terraincollision()==1 or objectcollision()>0 or playercollision()~=projectiles[id].ignore then
  125.                 if (math.abs(projectiles[id].sx)>0.5) then playsound(cc.fraggrenade.sfx_bounce) end
  126.                 projectiles[id].x=projectiles[id].x-msubx
  127.                 projectiles[id].sx=-projectiles[id].sx*0.3
  128.                 msubx=-msubx*0.3
  129.             end
  130.         else
  131.             projectiles[id].ignore=0
  132.         end
  133.         -- Move Y
  134.         projectiles[id].y=projectiles[id].y+msuby
  135.         if collision(col5x5,projectiles[id].x,projectiles[id].y)==1 then
  136.             if terraincollision()==1 or objectcollision()>0 or playercollision()~=projectiles[id].ignore then
  137.                 if (math.abs(projectiles[id].sy)>0.5) then playsound(cc.fraggrenade.sfx_bounce) end
  138.                 projectiles[id].y=projectiles[id].y-msuby
  139.                 projectiles[id].sy=-projectiles[id].sy*0.3
  140.                 msuby=-msuby*0.3
  141.                 projectiles[id].sx=projectiles[id].sx*0.9
  142.                 msubx=msubx*0.9
  143.             end
  144.         else
  145.             projectiles[id].ignore=0
  146.         end        
  147.         -- Water
  148.         if (projectiles[id].y)>getwatery()+5 then
  149.             -- Effects
  150.             particle(p_waterhit,projectiles[id].x,projectiles[id].y)
  151.             playsound(sfx_hitwater1)
  152.             -- Free projectile
  153.             freeprojectile(id)
  154.             break
  155.         end
  156.     end
  157.     -- Timer -> Explode
  158.     projectiles[id].timer=projectiles[id].timer-1
  159.     if projectiles[id].timer<=0 then
  160.         -- Cause damage
  161.         arealdamage(projectiles[id].x,projectiles[id].y,60,15)
  162.         -- Destroy terrain
  163.         terrainexplosion(projectiles[id].x,projectiles[id].y,15,1)
  164.         -- Crater
  165.         grey=math.random(0,40)
  166.         terrainalphaimage(gfx_crater100,projectiles[id].x,projectiles[id].y,math.random(6,9)*0.1,grey,grey,grey)
  167.         -- Free projectile
  168.         freeprojectile(id)
  169.         -- Spawn Clusters
  170.         math.randomseed(projectiles[id].x*3+projectiles[id].y)
  171.         for i=-2,2,1 do
  172.             pid=createprojectile(cc.fraggrenade.cluster.id)
  173.             projectiles[pid]={}
  174.             projectiles[pid].x=projectiles[id].x+math.random(-20,20)*0.1
  175.             projectiles[pid].y=projectiles[id].y+math.random(-20,20)*0.1
  176.             projectiles[pid].sx=math.random(-10,10)*0.1
  177.             projectiles[pid].sy=math.random(-10,10)*0.1
  178.             if i==0 then projectiles[pid].follow=1 end
  179.         end
  180.     end
  181.     -- Scroll to projectile
  182.     scroll(projectiles[id].x,projectiles[id].y)
  183. end
  184.  
  185. --------------------------------------------------------------------------------
  186. -- Projectile: Cluster
  187. --------------------------------------------------------------------------------
  188.  
  189. cc.fraggrenade.cluster.id=addprojectile("cc.fraggrenade.cluster")        -- Add Projectile
  190.  
  191. function cc.fraggrenade.cluster.draw(id)                                -- Draw
  192.     -- Setup draw mode
  193.     setblend(blend_alpha)
  194.     setalpha(1)
  195.     setcolor(255,255,255)
  196.     setscale(1,1)
  197.     -- Calculate projectile rotation
  198.     setrotation(math.deg(math.atan2(projectiles[id].sx,-projectiles[id].sy)))
  199.     -- Draw projectile
  200.     drawimage(cc.fraggrenade.gfx_cluster,projectiles[id].x,projectiles[id].y)
  201. end
  202.  
  203. function cc.fraggrenade.cluster.update(id)                                -- Update
  204.     rot=math.deg(math.atan2(projectiles[id].sx,-projectiles[id].sy))
  205.     -- Particle Tail
  206.     particle(p_smoke,projectiles[id].x-math.sin(math.rad(rot))*7,projectiles[id].y+math.cos(math.rad(rot))*7)
  207.     particlespeed(math.random(-2,2)*0.1,math.random(-2,2)*0.1)
  208.     particlefadealpha(0.05)
  209.     -- Wind + Gravity influence on speed
  210.     projectiles[id].sx=projectiles[id].sx+getwind()*0.15
  211.     projectiles[id].sy=projectiles[id].sy+getgravity()
  212.     -- Move (in substep loop for optimal collision precision)
  213.     msubt=math.ceil(math.max(math.abs(projectiles[id].sx),math.abs(projectiles[id].sy))/3)
  214.     msubx=projectiles[id].sx/msubt
  215.     msuby=projectiles[id].sy/msubt
  216.     for i=1,msubt,1 do
  217.         projectiles[id].x=projectiles[id].x+msubx
  218.         projectiles[id].y=projectiles[id].y+msuby
  219.         -- Collision
  220.         if collision(col3x3,projectiles[id].x,projectiles[id].y)==1 then
  221.             -- Cause damage
  222.             arealdamage(projectiles[id].x,projectiles[id].y,50,12)
  223.             -- Destroy terrain
  224.             terrainexplosion(projectiles[id].x,projectiles[id].y,12,1)
  225.             -- Crater
  226.             grey=math.random(0,40)
  227.             terrainalphaimage(gfx_crater75,projectiles[id].x,projectiles[id].y,math.random(4,6)*0.1,grey,grey,grey)
  228.             -- Free projectile
  229.             freeprojectile(id)
  230.             break
  231.         end
  232.         -- Water
  233.         if (projectiles[id].y)>getwatery()+5 then
  234.             -- Effects
  235.             particle(p_waterhit,projectiles[id].x,projectiles[id].y)
  236.             playsound(sfx_hitwater1)
  237.             -- Free projectile
  238.             freeprojectile(id)
  239.             break
  240.         end
  241.     end
  242.     -- Scroll to projectile
  243.     if projectiles[id].follow==1 then
  244.         scroll(projectiles[id].x,projectiles[id].y)
  245.     end
  246. end